/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.gov.cemaden.library.dao;

import br.gov.cemaden.library.dao.staff.AplicacaoDao;
import br.gov.cemaden.library.interfaces.UsuarioInterface;
import br.gov.cemaden.library.model.Usuario;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author paulo.dias
 */
public class UsuarioDao extends GenericDao implements UsuarioInterface {

    private Session session;

    public UsuarioDao(Session session) {
        this.session = session;
    }

    @Override
    public List<Usuario> findAll() {
        //Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tx = session.beginTransaction();
        List<Usuario> usuarios = null;
        try {
            Query query = session.getNamedQuery("Usuario.findAll");
            usuarios = (List<Usuario>) query.list();
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            System.out.println("Erro no Usuario.findAll: " + e.getMessage() + " - Causa: " + e.getCause());
            throw new HibernateException(e);
        }
        return usuarios;
    }

    @Override
    public Usuario findById(Long id) {
        //Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tx = session.beginTransaction();
        Usuario usuario = null;
        try {
            Query query = session.getNamedQuery("Usuario.findById").setParameter("id", id);
            usuario = (Usuario) query.uniqueResult();
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            System.out.println("Erro no Usuario.findById: " + e.getMessage() + " - Causa: " + e.getCause());
            throw new HibernateException(e);
        }
        return usuario;
    }

    @Override
    public List<Usuario> findByPermissao(String permissao) {
        //Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tx = session.beginTransaction();
        List<Usuario> usuario = null;
        try {
            Query query = session.getNamedQuery("Aplicacao.findByPermissao").setParameter("permissao", permissao);
            usuario = (List<Usuario>) query.list();
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            System.out.println("Erro no Usuario.findByPermissao: " + e.getMessage() + " - Causa: " + e.getCause());
            throw new HibernateException(e);
        }
        return usuario;
    }

    @Override
    public List<Usuario> findByAtivo(boolean ativo) {
        //Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tx = session.beginTransaction();
        List<Usuario> usuario = null;
        try {
            Query query = session.getNamedQuery("Aplicacao.findByAtivo").setParameter("ativo", ativo);
            usuario = (List<Usuario>) query.list();
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            System.out.println("Erro no Usuario.findByAtivo: " + e.getMessage() + " - Causa: " + e.getCause());
            throw new HibernateException(e);
        }
        return usuario;
    }

    @Override
    public Usuario findByEmail(String email) {
        //Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tx = session.beginTransaction();
        Usuario usuario = null;
        try {
            Query query = session.getNamedQuery("Usuario.findByEmail").setParameter("email", email);
            usuario = (Usuario) query.uniqueResult();
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            System.out.println("Erro no Usuario.findByEmail: " + e.getMessage() + " - Causa: " + e.getCause());
            throw new HibernateException(e);
        }
        return usuario;
    }

    @Override
    public Usuario findByCelular(String celular) {
        //Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tx = session.beginTransaction();
        Usuario usuario = null;
        try {
            Query query = session.getNamedQuery("Usuario.findByCelular").setParameter("celular", celular);
            usuario = (Usuario) query.uniqueResult();
            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            System.out.println("Erro no Usuario.findByCelular: " + e.getMessage() + " - Causa: " + e.getCause());
            throw new HibernateException(e);
        }
        return usuario;
    }

    @Override
    public void insert(Usuario usuario) {
        try {
            saveOrUpdate(this.session, usuario);
        } catch (Exception ex) {
            Logger.getLogger(AplicacaoDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void update(Usuario usuario) {
        try {
            saveOrUpdate(this.session, usuario);
        } catch (Exception ex) {
            Logger.getLogger(AplicacaoDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void delete(Usuario usuario) {
        try {
            remove(this.session, usuario);
        } catch (Exception ex) {
            Logger.getLogger(AplicacaoDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}
